// #pragma once

// #include <vsg/all.h>
// #include <vsgQt/Viewer.h>

// #include <unordered_map>
// #include <vector>

// // 渲染对象类型
// enum struct RenderObjType { None = 0, Polygon, Path, Text };

// // 渲染管线类型（实例化与否x填充与否）
// enum struct RenderPipelineType { NormalBorder = 0, InstacneBorder, NormalFill, InstanceFill, Num };

// // 渲染样式类型
// enum struct RenderStyleType { Normal = 0,Num };

// // 绘制调用
// struct DrawCall {
//   DrawCall();

//   // 构建绘制命令
//   void Build(vsg::ref_ptr<vsg::Group> _parent, bool _instance);

//   // 根据vetrexes indexes matCol012更新绘制命令
//   void Update();

//   vsg::ref_ptr<vsg::vec2Array> vertexes;
//   vsg::ref_ptr<vsg::uintArray> indexes;

//   vsg::ref_ptr<vsg::vec3Array> matCol012;

//   bool instance;
//   vsg::ref_ptr<vsg::Commands> draw_commands;

//   vsg::ref_ptr<vsg::BindVertexBuffers> bind_vertex;
//   vsg::ref_ptr<vsg::BindVertexBuffers> bind_mat;
//   vsg::ref_ptr<vsg::BindIndexBuffer> bind_index;
//   vsg::ref_ptr<vsg::DrawIndexed> draw_config;
// };

// struct RenderStyleBase {
//   RenderStyleBase(){};

//   virtual void Build(vsg::ref_ptr<vsg::StateGroup> parent, uint32_t _layer_id, vsg::ref_ptr<vsg::DescriptorSetLayout> descriptorSetLayout,
//                      vsg::ref_ptr<vsg::PipelineLayout> pipelineLayout) = 0;
//   virtual void Update() = 0;

//   vsg::ref_ptr<vsg::Group> styleGroup;
//   uint32_t layer_id;
// };

// template <typename UniformType>
// struct RenderStyle : public RenderStyleBase {
//   RenderStyle();

//   void Build(vsg::ref_ptr<vsg::StateGroup> parent, uint32_t _layer_id, vsg::ref_ptr<vsg::DescriptorSetLayout> descriptorSetLayout,
//              vsg::ref_ptr<vsg::PipelineLayout> pipelineLayout) override;
//   void Update() override;

//   vsg::ref_ptr<vsg::Value<UniformType>> value;
// };

// template <typename UniformType>
// RenderStyle<UniformType>::RenderStyle() : RenderStyleBase() {}

// template <typename UniformType>
// void RenderStyle<UniformType>::Build(vsg::ref_ptr<vsg::StateGroup> parent, uint32_t _layer_id,
//                                      vsg::ref_ptr<vsg::DescriptorSetLayout> descriptorSetLayout, vsg::ref_ptr<vsg::PipelineLayout> pipelineLayout) {
//   layer_id = _layer_id;
//   styleGroup = vsg::Group::create();
//   parent->addChild(styleGroup);
//   value = vsg::Value<UniformType>::create();
//   value->properties.dataVariance = vsg::DataVariance::DYNAMIC_DATA;

//   auto Desc = vsg::DescriptorBuffer::create(value, 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);

//   auto descriptorSet = vsg::DescriptorSet::create(descriptorSetLayout, vsg::Descriptors{Desc});
//   auto bindDescriptorSet = vsg::BindDescriptorSet::create(VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, descriptorSet);

//   this->styleGroup->addChild(bindDescriptorSet);
// }

// struct Border_Uniform {
//   vsg::vec4 color;
// };
// struct Fill_Uniform {
//   vsg::vec4 color;
//   float k;
//   float b;
//   float c;
// };

// template <typename UniformType>
// void RenderStyle<UniformType>::Update() {}

// template <>
// inline void RenderStyle<Border_Uniform>::Update() {
//   value->value().color = vsg::vec4(22.0 / 255, 119.0 / 255, 179.0 / 255, 1.0);
//   value->dirty();
// }
// template <>
// inline void RenderStyle<Fill_Uniform>::Update() {
//   value->value().color = vsg::vec4(240.0 / 255, 161.0 / 255, 168.0 / 255, 1.0);
//   value->value().k = 1.0;
//   value->value().b = 0.03;
//   value->value().c = 0.002;
//   value->dirty();
// }

// vsg::ref_ptr<vsg::StateGroup> CreateNormalPipeline(std::string path, std::string vs_name, std::string fs_name,
//                                                    vsg::ref_ptr<vsg::DescriptorSetLayout>& descriptorSetLayout,
//                                                    vsg::ref_ptr<vsg::PipelineLayout>& pipelineLayout, VkPrimitiveTopology topology,
//                                                    VkBool32 primitiveRestartEnable);
// vsg::ref_ptr<vsg::StateGroup> CreateInstancePipeline(std::string path, std::string vs_name, std::string fs_name,
//                                                      vsg::ref_ptr<vsg::DescriptorSetLayout>& descriptorSetLayout,
//                                                      vsg::ref_ptr<vsg::PipelineLayout>& pipelineLayout, VkPrimitiveTopology topology,
//                                                      VkBool32 primitiveRestartEnable);

// struct RenderPipeline {
//   RenderPipeline();

//   void Build(vsg::ref_ptr<vsg::Group> parent, RenderPipelineType pipelineType);

//   vsg::ref_ptr<vsg::StateGroup> stateGroup;

//   vsg::ref_ptr<vsg::DescriptorSetLayout> descriptorSet;
//   vsg::ref_ptr<vsg::PipelineLayout> pipelineLayout;
// };

// struct RenderStyleTag {
//   RenderPipelineType pipelineType;
//   uint32_t layer;
//   RenderStyleType styleType;

//   bool operator==(const RenderStyleTag& rth) const {
//     return (pipelineType == rth.pipelineType) && (layer == rth.layer) && (styleType == rth.styleType);
//   }

//   struct Hash {
//     std::size_t operator()(const RenderStyleTag& self) const {
//       return std::hash<uint32_t>()((int)self.pipelineType * 1 + (uint32_t)self.styleType * 10 + (uint32_t)self.layer * 100);
//     }
//   };
// };

// namespace qlib {
// class Library;
// }

// class RenderSystem {
//  public:
//   static RenderSystem* Instance();

//   void Build(vsg::ref_ptr<vsgQt::Viewer> viewer, vsg::ref_ptr<vsg::Group> parent);

//   void BuildScene(std::shared_ptr<qlib::Library> library);

//   DrawCall& GetNewDrawCall(RenderStyleTag styleTag);
//   std::vector<DrawCall>& GetDrawCalls(RenderStyleTag styleTag);

//  private:
//   void BuildPipeline();
//   void AddLayer(int layer_id);

//  private:
//   vsg::ref_ptr<vsgQt::Viewer> viewer;
//   vsg::ref_ptr<vsg::Group> scene;

//   std::unordered_map<uint32_t, bool> layer_has;

//   std::unordered_map<RenderPipelineType, RenderPipeline> pipe_map;

//   std::unordered_map<RenderStyleTag, RenderStyleBase*, RenderStyleTag::Hash> style_map;

//   std::unordered_map<RenderStyleTag, std::vector<DrawCall>, RenderStyleTag::Hash> drawCall_map;
// };